import re

def split_str():
    str = '123, 456'
    print(str.split(' ', 1)) # 第二个参数为分割次数
    print(re.split(r'\s', str)) # 支持更复杂的分割方式,通过配置正则表达式进行分割
    print(re.split(r'(,)\s', str))
    print(re.split(r'(?:,)\s', str))
    '''
    使用re.split注意点：
        1、使用捕获组时，捕获组结果也会包含在返回结果中；
        2、可以通过?:使捕获组结果不在返回结果中
    '''

def test_str_start_end_with():
    print('========= 字符串开头结尾文本匹配 =======')
    str = 'https://www.baidu.com'
    print(str.startswith('http'))
    print(str.startswith(('httpa', 'https'))) # 也可传入元组进行多个值的匹配

    print(str.endswith('.com'))
    print(str)
    # # 方案二：切片、正则表达式
    print(str[:4] == 'http')
    res = re.match('^http:|https:', str)
    print(res.group())

def reModule():
    print('========== re模块 ============')
    pattern = re.compile(r'\d+')
    m = pattern.match('one234dgdf')
    print(m) # None 此时匹配字符串头部
    m = pattern.match('one234dgdf', 3, 8)
    print(m)
    print(m.group(0))
    print(m.start(0))
    print(m.end(0))
    print(m.span(0))
    m2 = pattern.search('hello 1234 56') # 此时使用match就无法匹配成功
    print(m2.group())
    print(m2.span())
    m3 = pattern.findall('hello 234 56')
    m4 = pattern.findall('hello 234 56', 0, 9)
    print(m3)
    print(m4)

    m5 = pattern.finditer('hello 234 56')
    print(m5)
    for sub_str in m5:
        print(sub_str.group())
    
    p2 = re.compile(r'(\w+) (\w+)')
    s = 'hello 123, hello 456'
    def func(m):
        return 'hi' + ' ' + m.group(2)
    print(p2.sub(r'hello world', s)) # 使用 'hello world' 替换 'hello 123' 和 'hello 456'
    print(p2.sub(r'\2 \1', s)) # 引用分组
    print(p2.sub(func, s))
    print(p2.sub(func, s, 1))
    s2 = 'python,sf,Python,sfsd,PYthON'
    print(re.findall('python', s2, flags=re.IGNORECASE)) # 添加flag指定不区分大小写

def matchcase(word): # 仅针对首字母大写和全部大写
    def replace(m):
        text = m.group()
        if text.isupper():
            return word.upper()
        elif text.islower():
            return word.lower()
        elif text[0].isupper():
            return word.capitalize()
        else:
            return word
    return replace

def short_match():
    print('==== 最短文本匹配 =====')
    str_pat = re.compile(r'\"(.*?)\"') # 通过?达到正则表达式最短匹配
    text = 'computer says" no." Phone says "yes"'
    print(str_pat.findall(text))

def match_line_break():
    print('======== 匹配换行符 =======')
    text = '''/* this is a
    multiline comment */
    '''
    comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
    comment2 = re.compile(r'/\*((?:.|\n)*?)\*/')
    print(comment.findall(text))
    print(comment2.findall(text))

def remove_unusefule_char():
    s = ' hello world \n '
    '''
        strip/lstrip/rstrip都是默认去除空格，
        strip去除首部和尾部字符
        lstrip去除首部字符
        rstrip去除尾部字符
        都不会对中间字符产生影响
    '''
    print(s.strip())
    print(s.lstrip())
    print(s.rstrip())
    str = '-----hello======'
    print(str.strip('-=')) # 传参去除指定字符

if __name__ == '__main__':
    split_str()
    test_str_start_end_with()
    reModule()
    print('========= 大小写匹配替换方案 =======')
    s = 'python,sf,Python,sfsd,PYTHON'
    print(re.sub('python', matchcase('snake'), s, flags=re.IGNORECASE)) 
    short_match()
    match_line_break()
    remove_unusefule_char()
